/*
 * @(#)ModAuthLogin.java 1.00 28 Ago 2007
 *
 * Copyright (c) 2005-2007 Soluciones Info Móviles S.A.C.
 * Av. Javier Prado Oeste 203 - Piso 13, Lima 27, Perú.
 * Todos los derechos reservados.
 */

package sim.auth;

import sim.framework.io.*;
import sim.framework.*;
import sim.auth.DocAuth;
import sim.utils.Utils;

/**
 * Clase que obtiene la cadena de autenticación del
 * servidor
 *
 * @author  Omar Quintana
 * @since   1.0
 */
public final class ModAuthLogin extends ModSimio {
    
    private final byte[] AUTH_CMD  = { 'l', 'o', 'g', 'i', 'n', ' '};
    
    private DocAuth m_DocAuth;	// Documento de autenticación
    private boolean m_LoginOK = false;
    
    protected ModAuthLogin(int i, Simlet s) {
        super(i, s);
        m_DocAuth = (DocAuth) getDocument(Simlet.MOD_AUTH);
    }
    
    protected int simioClient() {

	int ret;

	//#ifdef DEBUG_MODAUTHLOGIN
	//# System.out.println("ModAuthLogin::simioClient() ENTERED");
	//#endif

        switch (getStatus()) {
	case ModSimio.STATUS_NONE:
	    printMessage(getLabel(Resource.LBL_MESG_AUTH_ERR));
	    break;
	case ModSimio.STATUS_COMMAND:
	    // Comando de autenticacion
	    write(AUTH_CMD);
	    // Login del usuario
	    write(m_DocAuth.getLogin());
	    // Fin de línea
	    write(Utils.ENDOFLINE);
	    break;
	case ModSimio.STATUS_INPUT:
	    gets();
	    break;
	case ModSimio.STATUS_READY:
	    // Cerramos la conexión
	    closeConnection();
	    // Hacia donde nos vamos dependerá de la conexión.
	    if (m_LoginOK) {
		execNext();
	    }
	    else {
		execBack();
	    }
        }

	//#ifdef DEBUG_MODAUTHLOGIN
	//# System.out.println("ModAuthLogin::simioClient() EXITING");
	//#endif

        return ModSimio.OK;
    }


    protected boolean simioGetsLine(final byte[] line, int start, int length) {
	byte[] login;

	//#ifdef DEBUG_MODAUTHLOGIN
	//# System.out.println("ModAuthLogin::simioGetsLine() ENTERED");
	//#endif

	login = m_DocAuth.getLogin();
	if (Utils.memncmp(login, 0,
			  line, start, 
			  length) == 0) {
	    //#ifdef DEBUG_MODAUTHLOGIN
	    //# System.out.println("\tLogin OK!!!");
	    //#endif
	    m_LoginOK = true;
	}

	//#ifdef DEBUG_MODAUTHLOGIN
	//# System.out.println("ModAuthLogin::simioGetsLine() EXITING");
	//#endif

	return true;
    }

    protected int simioCancel() {
	//#ifdef DEBUG_MODAUTHLOGIN
	//# System.out.println("ModAuthLogin::simioCancel() ENTERED");
	//#endif

        execBack();

	//#ifdef DEBUG_MODAUTHLOGIN
	//# System.out.println("ModAuthLogin::simioCancel() EXITING");
	//#endif
        return ModSimio.OK;
    }
            
}
